package com.qf.listener;

import com.alibaba.fastjson.JSON;
import com.qf.pojo.MsgObj;
import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

@Component
//txProducerGroup 必须和发送事务消息时指定的值保持一致
@RocketMQTransactionListener(txProducerGroup = "txGroup1")
public class TransactionListener implements RocketMQLocalTransactionListener {

    //当半消息主题收到事务消息后，触发的生产端回调
    /*
        Message msg: 事务消息
        Object arg：发送事务消息时的额外参数
     */
    @Override
    public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {
        //这个方法返回的数据类型是一个byte[]
        byte[] payload = (byte[]) msg.getPayload();
        String str = new String(payload);

        MsgObj msgObj = JSON.parseObject(str, MsgObj.class);

        //根据msgObj的消息内容，进行本地数据库的事务处理
        //假设 id--1  成功
        //假设 id--2  失败
        //假设 id--其他  未知

        System.out.println("半消息收到事务消息，触发本地事务回调。。。");

        if (msgObj.getId() == 1){
            //返回的是这个状态，消息是会到达目标主题的，下游服务就开始执行具体业务
            return RocketMQLocalTransactionState.COMMIT;
        }else if (msgObj.getId() == 2){
            //返回的是这个状态，消息是不会到达目标主题的，下游服务就不会执行具体业务
            return RocketMQLocalTransactionState.ROLLBACK;
        }else{
            //返回的是这个状态，会触发回查
            return RocketMQLocalTransactionState.UNKNOWN;
        }
    }

    //当半消息主题收到UNKNOW状态时，触发的生产端回调
    //每隔1分钟回查一次，默认是回查15次
    @Override
    public RocketMQLocalTransactionState checkLocalTransaction(Message msg) {
        //查询本地数据库，检查数据库执行的结果
        //数据库执行成功，返回COMMIT
        //数据库执行失败，返回ROLLBACK
        //数据库执行未知状态，返回UNKNOW  1分钟后，会再次回查

        System.out.println("回查时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        return RocketMQLocalTransactionState.UNKNOWN;
    }
}
